摘要
這篇文章探討了檢索增強生成 (Retrieval-Augmented Generation, RAG) 技術,它結合了資訊檢索和文本生成,以克服現有大型語言模型的缺陷。文中首先分析了傳統語言模型的幻覺問題、知識時效性和企業資料安全考量等局限性,並以此引出 RAG 架構的必要性。接著文章介紹了 RAG 的核心組成部分,包括索引、檢索和生成,以及 RAG 的各種應用場景。文章進一步論述了 RAG 的優勢,特別強調了其在降低建置系統成本方面的優勢。最後,文章重點介紹了Agentic RAG 的概念,以及如何使用 LangGraph 框架來實現一個智慧檢索系統。文末提供了一個完整的程式碼範例,展示了如何使用 LangGraph 來構建一個 Agentic RAG 系統,以及如何使用這個系統來回答使用者問題。總之,這篇文章為讀者提供了一個深入淺出的 RAG 技術概述,以及如何使用 LangGraph 框架來構建一個實用的 Agentic RAG 系統。
隨著人工智慧技術的迅速發展,資訊檢索與生成系統面臨著前所未有的挑戰與機遇。檢索增強生成(Retrieval-Augmented Generation, RAG)技術作為一種創新解決方案,在提升大型語言模型性能方面展現出巨大潛力。
本文旨在系統性地探討RAG技術的最新發展,特別聚焦於Agentic RAG這一新興概念。Agentic RAG通過整合代理(Agent)機制,顯著提升了系統的自適應能力和決策智能。我們將深入分析這一技術如何優化檢索策略、提高生成質量,並擴展RAG系統的應用範疇。
文章的核心部分將詳細闡述如何運用LangGraph框架實現Agentic RAG系統。我們將逐步介紹從資料準備、核心組件設計到工作流程構建的全過程。通過具體的程式碼示例和實踐指導,本文旨在為研究人員和開發者提供一個可操作的技術藍圖。
在我們開始探討 RAG (Retrieval-Augmented Generation) 架構之前,我們先來看看現行的語言模型所面臨的一些挑戰。這些挑戰不只限制了語言模型的效能,也影響了它在各種實際應用中的表現。接下來,我們會一一探討這些挑戰,並在了解了這些挑戰之後,我們將會看到 RAG 是如何有效地解決這些挑戰的。
隨著人工智能技術的快速發展,大型語言模型雖然取得了驚人的成就,但同時也面臨著一系列挑戰。這些挑戰不僅限制了模型的應用範圍,也引發了人們對AI可靠性和實用性的思考。
所有的AI模型的底層原理都是基於數學機率,其模型輸出實質上是一系列數值運算,大型模型也不例外,所以它有時候會一本正經地胡說八道,尤其是在大型模型自身不具備某一方面的知識或不擅長的場景。例如,如果我們問大型模型,“故宮博物館下禮拜一開門嗎?”語言模型可能會告訴你它開門,但實際上它並不知道確切的答案。這種情況在需要非常精確的場景中,僅依賴生成式回答是不夠嚴謹的。
大型語言模型的知識完全來自於它的訓練數據,而現有的主流大模型(例如 ChatGPT、Phi-2、Mistral7b等)的訓練集基本上都是建立在網路公開的數據上。對於一些即時性的、非公開的或離線的數據,語言模型是無法獲取到的,因此這部分的知識也就無法具備。例如,如果我們問大模型“今天晚上有什麼電影值得去看?”這種任務需要先去 Yahoo 電影得到最新的電影信息,大模型本身無法完成這個任務
對於企業來說,資料安全至關重要,沒有企業願意承擔資料外洩的風險,將自身的私有資訊上傳第三方平台進行訓練。這也導致完全依賴通用大型模型自身能力的應用方案不得不在數據安全和效果方面進行取捨。例如,如果企業人員想提出一個類似這樣的問題:“幫我看看3月份XX部門的銷售環比數據與哪些兄弟部門的增長是密切相關的?”這需要打通企業內部的很多數據。既要確保安全,又要借助AI能力,那麼最好的方式就是把數據全部放在本地,企業數據的業務計算全部在本地完成。而在線的大型模型僅僅完成一個歸納的功能,甚至,LLM都可以完全本地化部署。
RAG(Retrieval-Augmented Generation)作為一種創新的解決方案,巧妙地結合了信息檢索和文本生成技術。通過這種方法,我們可以顯著提升AI系統的準確性和可靠性,為各種應用場景提供更加智能和精確的回應。
2.1 RAG 的概念介紹
RAG 是一種將信息檢索與生成模型結合在一起的方法,用於回答有關自定義數據集的問題。當涉及到特定領域的問答時,大型語言模型(如 ChatGPT 和 Bard)可能會產生幻覺。因此,我們需要一個統一的系統來實現從文檔提取到回答生成以及之間的所有過程,這個過程就被稱為 RAG。
圖取材自:Meet Vectara: powerful, free neural search
RAG (Retrieval-Augmented Generation) 是一種結合了搜尋檢索和生成能力的自然語言處理架構。它主要由三個部分組成:Index、Retrieval 和 Generation。
索引是一種數據結構,用於儲存大量數據並允許快速的查詢操作。在 RAG 架構中,所有的資料,包括結構化和非結構化文件等,被翻譯成一種通用格式並存儲在一個可以供生成 AI 系統訪問的知識庫中。這些數據被處理成數值表示形式 (向量),並存儲在向量數據庫中,這可以迅速搜索並用於檢索正確的上下文訊息。實務上,索引可能需要仰賴其他組件,例如向量化工具(如 Sentence Transformer)來將文本數據轉換為向量,以及數據庫系統(如 Milvus 或 FAISS)來儲存和檢索這些向量。
檢索是 RAG 架構中的第二個步驟,它使用用戶的查詢從外部知識源檢索相關上下文。為此,需要用嵌入模型將用戶查詢嵌入到與向量數據庫中額外上下文相同的向量空間。這樣就可以進行相似性搜索,從向量數據庫中返回最接近的前k個數據對象。
生成是 RAG 架構的最後一個步驟。在這個階段,將用戶查詢和檢索到的額外上下文放入一個提示模板中。然後,它依賴先進的語言模型(例如 ChatGPT)來生成答案。
透過這個架構,模型可以從外部知識庫搜尋相關信息,然後使用這些信息來生成回應或完成特定的 NLP 任務。這種方法使得在大規模數據集上的文本檢索和生成更為快速和準確。
RAG (Retrieval-Augmented Generation) 架構適用於需要外部知識來輔助回答的問答系統、智能對話系統以及其他自然語言處理應用。以下是一些具體的應用場景:
透過這個架構,模型可以從外部知識庫搜尋相關信息,然後使用這些信息來生成回應或完成特定的 NLP 任務。這種方法使得在大規模數據集上的文本檢索和生成更為快速和準確。
在AI技術不斷演進的今天,如何使語言模型更加智能、準確且具有成本效益成為了一個關鍵問題。RAG技術的出現為這個問題提供了一個優雅的解決方案,它不僅能夠提高模型的表現,還能夠在保證效果的同時降低成本。大型語言模型(LLM)學習新數據有三種方式。
通過數萬億的標記和數十億的參數在大量神經網絡上訓練,以創建大型語言模型。深度學習模型的參數是保存特定模型所有信息的係數或權重。像 GPT-4 這樣的模型訓練成本高達數億美元。這種方式超出了任何人的能力範圍。我們無法在新數據上重新訓練如此龐大的模型。這是不可行的。
另一個選擇是在現有數據上微調模型。微調涉及在訓練過程中使用預訓練模型作為起點。我們利用預訓練模型的知識在不同的數據集上訓練新模型。雖然這非常有效,但在時間和金錢上都很昂貴。除非有特定要求,否則微調沒有意義。
提示是一種方法,我們在 LLM 的上下文窗口中適配新信息,並使其根據提示中給出的信息回答查詢。它可能不像訓練或微調期間學到的知識那樣有效,但對許多實際用例(例如文檔問答)來說已經足夠了。 從文本文檔中提示回答是有效的,但這些文檔通常遠大於大型語言模型(LLM)的上下文窗口,這構成了挑戰。
檢索增強生成(RAG)通過處理、存儲和檢索相關文檔部分來解決這個問題,使 LLM 能夠有效地回答查詢。
我們已經探討了RAG系統的工作原理和優勢。為了實現這種系統,我們需要一個靈活且強大的框架。這就是LangGraph發揮作用的地方。它允許我們:
接下來,我們將深入探討如何使用 LangGraph 來構建一個Agentic RAG系統,展示其如何在實踐中提升檢索增強生成的效果。
在開始建構我們的 Agentic RAG 系統之前,我們需要準備一個豐富的知識庫。為了展示系統的實際應用,我們選擇了 Lilian Weng 的幾篇著名部落格文章作為我們的資料來源。Lilian Weng 是 OpenAI 的研究科學家,她的部落格文章以深入淺出地解析複雜的 AI 概念而聞名。
資料處理流程
urls = [
"https://lilianweng.github.io/posts/2023-06-23-agent/",
"https://lilianweng.github.io/posts/2023-03-15-prompt-engineering/",
"https://lilianweng.github.io/posts/2023-10-25-adv-attack-llm/",
]
# 載入文件
docs = [WebBaseLoader(url).load() for url in urls]
docs_list = [item for sublist in docs for item in sublist]
# 文本分割
text_splitter = RecursiveCharacterTextSplitter.from_tiktoken_encoder(
chunk_size=100, chunk_overlap=50
)
doc_splits = text_splitter.split_documents(docs_list)
# 創建向量儲存
vectorstore = Chroma.from_documents(
documents=doc_splits,
collection_name="rag-chroma",
embedding=OpenAIEmbeddings(),
)
retriever = vectorstore.as_retriever()
這個過程包括以下步驟:
首先,我們需要定義系統的狀態,這是整個工作流的基礎:
class AgentState(TypedDict):
messages: Annotated[Sequence[BaseMessage], add_messages]
這個狀態定義了在圖的各個節點之間傳遞的訊息結構。
系統包含四個關鍵節點,每個節點都負責特定的任務:
agent
: 理解使用者查詢並做出決策retrieve
: 使用檢索工具獲取相關文件rewrite
: 在需要時重新表述問題,提高查詢質量generate
: 生成最終的回答這個函數評估檢索到的文件是否與查詢相關,並決定下一步是直接生成答案還是重新建立問題。
def grade_documents(state) -> Literal["generate", "rewrite"]:
# ... (評分邏輯)
if score == "yes":
return "generate"
else:
return "rewrite"
下一步就是將它們組織成一個完整的工作流。這就是 LangGraph 發揮作用的地方。LangGraph 提供了強大的工具來定義和管理複雜的工作流程。
workflow = StateGraph(AgentState)
workflow.add_node("agent", agent)
workflow.add_node("retrieve", retrieve)
workflow.add_node("rewrite", rewrite)
workflow.add_node("generate", generate)
# 定義邊緣和條件
workflow.add_edge(START, "agent")
workflow.add_conditional_edges("agent", tools_condition, {...})
workflow.add_conditional_edges("retrieve", grade_documents)
workflow.add_edge("generate", END)
workflow.add_edge("rewrite", "agent")
# 編譯圖
graph = workflow.compile()
有了完整的工作流,我們就可以開始執行我們的 Agentic RAG 系統了。以下是一個簡單的執行示範:
inputs = {
"messages": [
("user", "Lilian Weng 如何介紹 agent memory?"),
]
}
for event in graph.stream(inputs, stream_mode="values"):
for message in event["messages"]:
message.pretty_print()
在這個例子中,我們首先定義了輸入,這是一個使用者查詢。然後,我們使用 graph.stream
方法來執行我們的工作流。這個方法會逐步執行工作流中的各個節點,並返回每一步的結果。
stream_mode="values"
參數表示我們希望獲取每個步驟的具體結果,而不僅僅是最終輸出。這對於理解系統的執行過程非常有幫助。
通過遍歷返回的事件流,我們可以看到系統在每一步的輸出。這包括了可能的查詢重寫、文件檢索結果,以及最終生成的答案。通過 pretty_print()
方法,我們可以以易讀的格式查看這些資訊。
本文深入探討了檢索增強生成(RAG)技術,闡述了它如何通過結合資訊檢索和文本生成來改進大型語言模型的表現。文章分析了傳統語言模型的局限性,詳細介紹了RAG的核心組件和優勢,並重點討論了Agentic RAG的概念及其使用LangGraph框架的實現方法。
解決傳統模型局限:RAG技術有效解決了傳統語言模型的幻覺問題、知識時效性和企業資料安全等挑戰。
成本效益:相比完整訓練或微調大型模型,RAG提供了一種更經濟實惠的方法來增強AI系統的能力。
Agentic RAG創新:通過整合代理機制,Agentic RAG提升了系統的自適應能力和決策智能。
LangGraph框架優勢:LangGraph框架使得實現複雜的RAG系統變得更加簡單,能夠定義多步驟、條件化的工作流程。
實務應用指南:文章提供了詳細的代碼示例,展示了從資料準備到系統執行的整個過程,這對實務應用非常有幫助。
RAG技術為AI系統帶來了新的可能性,不僅提高了回答的準確性,還為企業提供了一種安全、高效的方式來利用專有知識。隨著技術的不斷發展,我們可以期待看到更多RAG技術的創新應用,進一步推動AI領域的進步。
即刻前往教學程式碼 Repo,親自動手實作 Agentic RAG 吧!別忘了給專案按個星星並持續關注更新,讓我們一起探索AI代理的新境界。